package part15;

/**
 * @author wcj
 * @Date 2021/5/30 15:26
 * @Version 1.0
 */
public class Part1521 {

    /**
     * 泛型无法new T()的原因有两点：第一点，泛型进行了类型擦除；第二点，泛型没有默认的构造器
     * 这里通过创建一个工厂，然后传进Class类型标签，可以这样使用，但是对于Integer等类因为没有默认的构造器所以无法使用
     * 这种方式创建对象
     * 可以使用显式工厂解决这个问题，即将工厂的类型指明
     *
     * @param args
     */
    public static void main(String[] args) {
        ClassAsFactory<Employee> employeeClassAsFactory = new ClassAsFactory<>(Employee.class);
        System.out.println("Employ create success");
        ClassAsFactory<Integer> integerClassAsFactory = new ClassAsFactory<>(Integer.class);
    }
}

interface Factory<T> {
    T create();
}

class Foo2<T> {
    private T x;

    public <F extends Factory<T>> Foo2(F factory) {
        x = factory.create();
    }
}

class IntegerFactory implements Factory<Integer> {

    @Override
    public Integer create() {
        return new Integer(0);
    }
}

class Employee {
}

class ClassAsFactory<T> {
    T x;

    public ClassAsFactory(Class<T> kind) {
        try {
            x = kind.newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
